home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / OpenGL 1.0 SDK / Source / Examples / aux / samples / stencil.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  2.2 KB  |  125 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include "tk.h"
  5.  
  6.  
  7. GLenum directRender;
  8.  
  9.  
  10. static void Init(void)
  11. {
  12.  
  13.     glClearColor(0.0, 0.0, 0.0, 0.0);
  14.  
  15.     glClearStencil(0);
  16.     glStencilMask(1);
  17.     glEnable(GL_STENCIL_TEST);
  18. }
  19.  
  20. static void Reshape(int width, int height)
  21. {
  22.  
  23.     glViewport(0, 0, (GLint)width, (GLint)height);
  24.  
  25.     glMatrixMode(GL_PROJECTION);
  26.     glLoadIdentity();
  27.     glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0);
  28.     glMatrixMode(GL_MODELVIEW);
  29. }
  30.  
  31. static GLenum Key(int key, GLenum mask)
  32. {
  33.  
  34.     switch (key) {
  35.       case TK_ESCAPE:
  36.     tkQuit();
  37.     }
  38.     return GL_FALSE;
  39. }
  40.  
  41. static void Draw(void)
  42. {
  43.     glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
  44.  
  45.     glStencilFunc(GL_ALWAYS, 1, 1);
  46.     glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
  47.  
  48.     glColor3ub(200, 0, 0);
  49.     glBegin(GL_POLYGON);        
  50.         glVertex3i(-4, -4, 0);
  51.         glVertex3i( 4, -4, 0);
  52.         glVertex3i( 0,  4, 0);
  53.     glEnd();
  54.  
  55.     glStencilFunc(GL_EQUAL, 1, 1);
  56.     glStencilOp(GL_INCR, GL_KEEP, GL_DECR);
  57.  
  58.     glColor3ub(0, 200, 0);
  59.     glBegin(GL_POLYGON);
  60.         glVertex3i(3, 3, 0);
  61.         glVertex3i(-3, 3, 0);
  62.         glVertex3i(-3, -3, 0);
  63.         glVertex3i(3, -3, 0);
  64.     glEnd();
  65.  
  66.     glStencilFunc(GL_EQUAL, 1, 1);
  67.     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  68.  
  69.     glColor3ub(0, 0, 200);
  70.     glBegin(GL_POLYGON);
  71.         glVertex3i(3, 3, 0);
  72.         glVertex3i(-3, 3, 0);
  73.         glVertex3i(-3, -3, 0);
  74.         glVertex3i(3, -3, 0);
  75.     glEnd();
  76.  
  77.     glFlush();
  78. }
  79.  
  80. static GLenum Args(int argc, char **argv)
  81. {
  82.     GLint i;
  83.  
  84.     directRender = GL_TRUE;
  85.  
  86.     for (i = 1; i < argc; i++) {
  87.     if (strcmp(argv[i], "-dr") == 0) {
  88.         directRender = GL_TRUE;
  89.     } else if (strcmp(argv[i], "-ir") == 0) {
  90.         directRender = GL_FALSE;
  91.     } else {
  92.         printf("%s (Bad option).\n", argv[i]);
  93.         return GL_FALSE;
  94.     }
  95.     }
  96.     return GL_TRUE;
  97. }
  98.  
  99. void main(int argc, char **argv)
  100. {
  101.     GLenum type;
  102.  
  103.     if (Args(argc, argv) == GL_FALSE) {
  104.     tkQuit();
  105.     }
  106.  
  107.     tkInitPosition(30, 60, 300, 300);
  108.  
  109.     type = TK_RGB | TK_SINGLE | TK_STENCIL;
  110.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  111.     tkInitDisplayMode(type);
  112.  
  113.     if (tkInitWindow("Stencil Test") == GL_FALSE) {
  114.     tkQuit();
  115.     }
  116.  
  117.     Init();
  118.  
  119.     tkExposeFunc(Reshape);
  120.     tkReshapeFunc(Reshape);
  121.     tkKeyDownFunc(Key);
  122.     tkDisplayFunc(Draw);
  123.     tkExec();
  124. }
  125.